
/**
 * 棋子
 * abstract 抽象类 不能创建实例
 */
abstract class Chess {
  x:number = 0
  y:number = 0
  abstract readonly name:string;

  move(targetX: number, targetY:number):boolean{
    // 1. 边界判断
    // 2. 目标位置是否有乙方棋子
    // 3. 规则判断
    if(this.rule(targetX, targetY)){
      this.x = targetX
      this.y = targetY
      return true
    }
    return false
  }

  // 棋子移动规则验证
  protected abstract rule(targetX: number, targetY:number):boolean
}


/**
 * 棋子:马
 */
class Horse extends Chess {
  protected rule(targetX: number, targetY: number): boolean {
    return true
  }
  readonly name: string = "马";
}

/**
 * 棋子:炮
 */
class Pao extends Chess {
  protected rule(targetX: number, targetY: number): boolean {
    return true
  }
  readonly name: string;
  constructor(){
    super()
    this.name = "炮"
  }
}

/**
 * 棋子:兵
 */
class Soldier extends Chess {
  protected rule(targetX: number, targetY: number): boolean {
    return true
  }
  get name(){ // 使用访问器
    return "兵"
  }
}


// 应该创建一个具体的东西，而不应该创建一个棋子对象
// const c = new Chess()